home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ddj0897.zip / RCSC.ZIP / BIN / 8051.M4 next >
Text File  |  1997-01-12  |  13KB  |  809 lines

  1. divert(-1)
  2. #********************************************************************
  3. #
  4. #M4 definitions for implementing the Retargetable Concurrent Small C
  5. #virtual machine on the 8051
  6. #Copyright 1997 Andy W. K. Yuen
  7. #
  8. #********************************************************************
  9. #
  10. #register assignments
  11. #
  12. #********************************************************************
  13. define(`VSPL', 19h)
  14. define(`VSPH', 18h)
  15. define(`VBPL', 1bh)
  16. define(`VBPH', 1ah)
  17. define(`VR3', 1ch)
  18. define(`VR2', 1dh)
  19. define(`VR1', 1eh)
  20. define(`VR0', 1fh)
  21. define(`CP2', 21h)
  22. define(`CA', 22h)
  23. define(`CB', 23h)
  24. define(`CDPL', 25h)
  25. define(`CDPH', 24h)
  26. define(`V1L', `R3')
  27. define(`V1H', `R2')
  28. define(`V2L', `R5')
  29. define(`V2H', `R4')
  30. define(`VLCNT', `R6')
  31. define(`VACNT', `R7')
  32. define(`V1SIGN', `0')
  33. define(`V2SIGN', `1')
  34. define(`VRSIGN', `2')
  35.  
  36. #********************************************************************
  37. #
  38. #interrupt vector locations
  39. #
  40. #********************************************************************
  41. define(`VECTOR_0', 03h)
  42. define(`VECTOR_1', 0bh)
  43. define(`VECTOR_2', 13h)
  44. define(`VECTOR_3', 1bh)
  45. define(`VECTOR_4', 23h)
  46. define(`VECTOR_5', 2bh)
  47. define(`VECTOR_6', 33h)
  48. define(`VECTOR_7', 3bh)
  49. define(`VECTOR_8', 43h)
  50. define(`VECTOR_9', 4bh)
  51. define(`VECTOR_10', 53h)
  52. define(`VECTOR_11', 5bh)
  53.  
  54. #********************************************************************
  55. #
  56. #macros used internally
  57. #
  58. #********************************************************************
  59. define(`ADJUST',
  60. `ifelse(eval(index($1, `-') >= 0), 1, 
  61. `eval(($1-STACK)+5)', 
  62. `eval(($1*-1)+3)')')
  63.  
  64. define(`repeat', 
  65. `ifelse(eval($2 <= 0), 1, , `repeat(`$1', decr($2))'$1)')
  66.  
  67. define(`MAKENAME', `$1_$2')
  68.  
  69. define(`OPxy',
  70. `MOV A,$3
  71. ifelse(len($5), 0, `$1 A', `$1 A,$5')
  72. MOV $3,A
  73. MOV A,$4
  74. ifelse(len($6), 0, `$1 A', `$2 A,$6')
  75. MOV $4,A')
  76.  
  77. define(`OPxn',
  78. `MOV A,$3
  79. $1 A,#$5
  80. MOV $3,A
  81. MOV A,$4
  82. $2 A,#$6
  83. MOV $4,A')
  84.  
  85. define(`OPpn',
  86. `MOV DPL,V2L
  87. MOV DPH,V2H
  88. INC DPTR
  89. MOVX A,@DPTR
  90. $1 A,#$3
  91. MOVX @DPTR,A
  92. ifelse(len($2), 0,,
  93. `MOV DPL,V2L
  94. MOV DPH,V2H
  95. MOVX A,@DPTR
  96. $2 A,#$4
  97. MOVX @DPTR,A')')
  98.  
  99. define(`COPYxy',
  100. `MOV $1,#$3
  101. MOV $2,#$4')
  102.  
  103. define(`COPYxm',
  104. `MOV DPTR,#$3
  105. MOV $1,DPL
  106. MOV $2,DPH')
  107.  
  108. #********************************************************************
  109. #
  110. #RCSC pseudo instructions
  111. #
  112. #********************************************************************
  113. define(`CSCEXTRN',
  114. `
  115. extern code __addsp
  116. extern code __enter
  117. extern code __getb1p
  118. extern code __getb1s
  119. extern code __getb1su
  120. extern code __getw1p
  121. extern code __getw1s
  122. extern code __getw2p
  123. extern code __getw2s
  124. extern code __point1s
  125. extern code __point2s
  126. extern code __pushm
  127. extern code __pushp
  128. extern code __pushs
  129. extern code __ge12
  130. extern code __gt12
  131. extern code __le12
  132. extern code __lneg1
  133. extern code __lt12
  134. extern code __switch
  135. extern code __uge12
  136. extern code __ugt12
  137. extern code __ule12
  138. extern code __ult12
  139. extern code __return
  140. extern code __and12
  141. extern code __asl12
  142. extern code __asr12
  143. extern code __call1
  144. extern code __cscinit
  145. extern code __div12
  146. extern code __udiv12
  147. extern code __eq12
  148. extern code __mod12
  149. extern code __umod12
  150. extern code __mul12
  151. extern code __umul12
  152. extern code __ne12
  153. extern code __pop2
  154. extern code __push1
  155. extern code __push2
  156. ')
  157. define(`CSCTERM', `')
  158. define(`EXTERNAL',
  159. `ifelse($2, NEAR, `extern code $1', `extern xdata $1')')
  160. define(`TOSEG',
  161. `ifelse($1, CURSEG, , $1, 1,
  162. `ifelse(MNAME, libc,
  163. `SEG XDATA define(`CURSEG', 1)', 
  164. `SEG XDATA AT MAKENAME(MNAME, var_at) define(`CURSEG', 1)')', 
  165. `SEG CODE define(`CURSEG', 2)')')
  166. define(`ENDSEG', `')
  167. define(`DECLPUBLIC',
  168. `
  169. PUBLIC $1:
  170. ')
  171. define(`DECLARE', `$1:')
  172. define(`SHADOW',
  173. `define(`SHADOWING', 0)
  174. DS $1')
  175. define(`MODULENAME', 
  176. `define(`MNAME', $1)')
  177. define(`BEGINLIT', 
  178. ` SEG CODE AT MAKENAME(MNAME,lit_at) define(`CURSEG', 2)')
  179. define(`ENDLIT', `')
  180. define(`BEGINDUMP', `;;not supposed to be present')
  181.  
  182. #********************************************************************
  183. #
  184. #interrupt, task and monitor table creation macros
  185. #
  186. #********************************************************************
  187. define(`INTRS', 
  188. `
  189. __intr_$2:
  190. LCALL    __handler    ;;common interrupt handler
  191. DW    $1        ;;user interrupt function
  192. DW    $2        ;;interrupt number
  193. ')
  194.  
  195. define(`SETVECTOR',
  196. `SEG CODE AT VECTOR_$2
  197. LJMP    $1
  198. ')
  199.  
  200. define(`BEGINTASK',
  201. `
  202. SEG CODE AT MAKENAME(MNAME, task_at)
  203. ')
  204.  
  205. define(`ENDTASK', `')
  206. define(`TASKS', 
  207. `
  208. DW    $1        ;;task function
  209. DW    $2        ;;task priority
  210. DW    $3        ;;task stack size
  211. ')
  212.  
  213. define(`BEGINMON',
  214. `
  215. SEG CODE AT MAKENAME(MNAME,mon_at)
  216. ')
  217.  
  218. define(`ENDMON', `')
  219. define(`MNTRS', 
  220. `
  221. LJMP    $1        ;;monitor initialization function
  222. ')
  223.  
  224. define(`BEGININTR',
  225. `')
  226. define(`ENDINTR', `')
  227.  
  228. #********************************************************************
  229. #
  230. #RCSC virtual machine instruction set
  231. #
  232. #********************************************************************
  233. define(`ADD12',
  234. ``;;ADD12'
  235. OPxy(ADD, ADDC, V1L, V1H, V2L, V2H)')
  236.  
  237. define(`ADD1n',
  238. ``;;ADD1n($1)'
  239. OPxn(ADD, ADDC, V1L, V1H, LOW ($1), HIGH ($1))')
  240.  
  241. define(`ADD21',
  242. ``;;ADD21'
  243. OPxy(ADD, ADDC, V2L, V2H, V1L, V1H)')
  244.  
  245. define(`ADD2n',
  246. ``;;ADD2n($1)'
  247. OPxn(ADD, ADDC, V2L, V2H, LOW ($1), HIGH ($1))')
  248.  
  249. define(`ADDbpn',
  250. ``;;ADDbpn($1)'
  251. OPpn(ADD, , LOW ($1), HIGH ($1))')
  252.  
  253. define(`ADDwpn',
  254. ``;;ADDwpn($1)'
  255. OPpn(ADD, ADDC, LOW ($1), HIGH ($1))')
  256.  
  257. define(`ADDm_',
  258. `ADDm_COMMAn($1')
  259.  
  260. define(`ADDm_COMMAn',
  261. ``;;ADDm_COMMAn($1, $2)'
  262. MOV DPTR,#$1+1
  263. MOVX A,@DPTR
  264. ADD A,# LOW($2)
  265. MOVX @DPTR,A
  266. MOV DPTR,#$1
  267. MOVX A,@DPTR
  268. ADDC A,# HIGH($2)
  269. MOVX @DPTR,A')
  270.  
  271. define(`ADDSP',
  272. ``;;ADDSP($1)'
  273. ifelse(eval($1 < 0), 1, `define(`STACK', $1)',)
  274. `MOV DPTR,#' eval(`$1'*-1)
  275. LCALL __addsp')
  276.  
  277. define(`AND12',
  278. ``;;AND12'
  279. OPxy(ANL, ANL, V1L, V1H, V2L, V2H)')
  280.  
  281. define(`ANEG1',
  282. ``;;ANEG1'
  283. COM1
  284. rINC1(1)')
  285.  
  286. define(`ARGCNTn',
  287. ``;;ARGCNTn($1)'
  288. MOV VACNT,#$1')
  289.  
  290. define(`ASL12',
  291. ``;;ASL12'
  292. LCALL __asl12')
  293.  
  294. define(`ASR12',
  295. ``;;ASR12'
  296. LCALL __asr12')
  297.  
  298. define(`CALL1',
  299. ``;;CALL1'
  300. LCALL __call1')
  301.  
  302. define(`CALLm',
  303. ``;;CALLm($1)'
  304. LCALL $1')
  305.  
  306. define(`BYTE_',
  307. ` DB ')
  308.  
  309. define(`BYTEn',
  310. ` DB $1')
  311.  
  312. define(`BYTEr0',
  313. `Db 0 repeat(``,'0', decr($1))')
  314.  
  315. define(`COM1',
  316. ``;;COM1'
  317. OPxy(CPL, CPL, V1L, V1H)')
  318.  
  319. define(`COMMAn',
  320. `,$1)')
  321.  
  322. define(`DBL1',
  323. ``;;DBL1'
  324. CLR C
  325. OPxy(RLC, RLC, V1L, V1H)')
  326.  
  327. define(`DBL2',
  328. ``;;DBL2'
  329. CLR C
  330. OPxy(RLC, RLC, V2L, V2H)')
  331.  
  332. define(`DECbp',
  333. ``;;DECbp'
  334. CLR C
  335. OPpn(SUBB, , 1)')
  336.  
  337. define(`DECwp',
  338. ``;;DECwp'
  339. CLR C
  340. OPpn(SUBB, SUBB, 1, 0)')
  341.  
  342. define(`DIV12',
  343. ``;;DIV12'
  344. LCALL __div12')
  345.  
  346. define(`DIV12u',
  347. ``;;DIV12u'
  348. LCALL __udiv12');
  349.  
  350. define(`ENTER',
  351. ``;;ENTER'
  352. POP B
  353. POP ACC
  354. LCALL __enter
  355. ')
  356.  
  357. define(`EQ10f',
  358. ``;;EQ10f'
  359. MOV A,V1L
  360. ORL A,V1H
  361. JZ $+5
  362. LJMP $1')
  363.  
  364. define(`EQ12',
  365. ``;;EQ12'
  366. LCALL __eq12')
  367.  
  368. define(`GE10f',
  369. ``;;GE10f'
  370. MOV A,V1H
  371. JNB ACC.7,$6
  372. LJMP $1')
  373.  
  374. define(`GE12',
  375. ``;;GE12'
  376. LCALL __ge12')
  377.  
  378. define(`GE12u',
  379. ``;;GE12u'
  380. LCALL __uge12')
  381.  
  382. define(`GETb1m',
  383. ``;;GETb1m($1)'
  384. MOV DPTR,#$1
  385. MOVX A,@DPTR
  386. MOV V1L,A
  387. RLC A
  388. MOV A,#255
  389. JC $+3
  390. CLR A
  391. MOV V1H,A')
  392.  
  393. define(`GETb1mu',
  394. ``;;GETb1mu($1)'
  395. MOV DPTR,#$1
  396. MOVX A,@DPTR
  397. MOV V1L,A
  398. MOV V1H,#0')
  399.  
  400. define(`GETb1p',
  401. ``;;GETb1p($1)'
  402. MOV DPTR,# $1
  403. LCALL __getb1p')
  404.  
  405. define(`GETb1pu',
  406. ``;;GETb1pu($1)'
  407. MOV DPTR,# $1
  408. LCALL __getb1p')
  409.  
  410. define(`GETb1s',
  411. ``;;GETb1s($1)'
  412. ifdef(1, 1, `MOV DPTR,#' ADJUST($1))
  413. ifelse(eval(ADJUST($1) < 0), 1, `INC DPTR',)
  414. LCALL __getb1s');
  415.  
  416. define(`GETb1su',
  417. ``;;GETb1su($1)'
  418. ifdef(1, 1, `MOV DPTR,#' ADJUST($1))
  419. LCALL __getb1su')
  420.  
  421. define(`GETw1m',
  422. ``;;GETw1m($1)'
  423. MOV DPTR,#$1
  424. MOVX A,@DPTR
  425. MOV V1H,A
  426. INC DPTR
  427. MOVX A,@DPTR
  428. MOV V1L,A')
  429.  
  430. define(`GETw1m_',
  431. `GETw1m_PLUSn($1')
  432.  
  433. define(`GETw1m_PLUSn',
  434. ``;;GETw1m_PLUSn($1)'
  435. MOV DPTR,#$1
  436. MOVX A,@DPTR
  437. MOV V1L,A
  438. INC DPTR
  439. MOVX A,@DPTR
  440. MOV V1H,A')
  441.  
  442. define(`GETw1n',
  443. ``;;GETw1n($1)'
  444. COPYxy(V1L, V1H, LOW ($1), HIGH ($1))')
  445.  
  446. define(`GETw1p',
  447. ``;;GETw1p($1)'
  448. MOV DPTR,# $1
  449. LCALL __getw1p')
  450.  
  451. define(`GETw1s',
  452. ``;;GETw1s($1)'
  453. ifdef(1, 1, `MOV DPTR,#' ADJUST($1))
  454. LCALL __getw1s')
  455.  
  456. define(`GETw2m',
  457. ``;;GETw2m($1)'
  458. MOV DPTR,#$1
  459. MOVX A,@DPTR
  460. MOV V2H,A
  461. INC DPTR
  462. MOVX A,@DPTR
  463. MOV V2L,A')
  464.  
  465. define(`GETw2n',
  466. ``;;GETw2n($1)'
  467. COPYxy(V2L, V2H, LOW ($1), HIGH ($1))')
  468.  
  469. define(`GETw2p',
  470. ``;;GETw2p($1)'
  471. MOV DPTR,# $1
  472. LCALL __getw2p')
  473.  
  474. define(`GETw2s',
  475. ``;;GETw2s($1)'
  476. ifdef(1, 1, `MOV DPTR,#' ADJUST($1))
  477. LCALL __getw2s')
  478.  
  479. define(`GT10f',
  480. ``;;GT10f'
  481. MOV A,V1H
  482. JB ACC.7,$+7
  483. ORL A,V1L
  484. JNZ $+5
  485. LJMP $1')
  486.  
  487. define(`GT12',
  488. ``;;GT12'
  489. LCALL __gt12')
  490.  
  491. define(`GT12u',
  492. ``;;GT12u'
  493. LCALL __ugt12')
  494.  
  495. define(`INCbp',
  496. ``;;INCbp'
  497. OPpn(ADD, , 1)')
  498.  
  499. define(`INCwp',
  500. ``;;INCwp'
  501. OPpn(ADD, ADDC, 1, 0)')
  502.  
  503. define(`WORD_',
  504. ` DW ')
  505.  
  506. define(`WORDn',
  507. ` DW $1')
  508.  
  509. define(`WORDr0',
  510. `ifelse(CURSEG, 2, `DW 0 repeat(``,'0', decr($1))',
  511. `RW $1')')
  512.  
  513. define(`JMPm',
  514. ``;;JMPm($1)'
  515. LJMP $1')
  516.  
  517. define(`LABm',
  518. `
  519. $1')
  520.  
  521. define(`LE10f',
  522. ``;;LE10f'
  523. MOV A,V1H
  524. JNB ACC.7,$+7
  525. ORL A,V1L
  526. JZ $+5
  527. LJMP $1')
  528.  
  529. define(`LE12',
  530. ``;;LE12'
  531. LCALL __le12')
  532.  
  533. define(`LE12u',
  534. ``;;LE12u'
  535. LCALL __ule12')
  536.  
  537. define(`LNEG1',
  538. ``;;LNEG1'
  539. LCALL __lneg1')
  540.  
  541. define(`LT10f',
  542. ``;;LT10f'
  543. MOV A,V1H
  544. JB ACC.7,$+6
  545. LJMP $1')
  546.  
  547. define(`LT12',
  548. ``;;LT12'
  549. LCALL __lt12')
  550.  
  551. define(`LT12u',
  552. ``;;LT12u'
  553. LCALL __ult12')
  554.  
  555. define(`MOD12',
  556. ``;;MOD12'
  557. LCALL __mod12')
  558.  
  559. define(`MOD12u',
  560. ``;;MOD12u'
  561. LCALL __umod12')
  562.  
  563. define(`MOVE21',
  564. ``;;MOVE21'
  565. MOV A,V1L
  566. MOV V2L,A
  567. MOV A,V1H
  568. MOV V2H,A')
  569.  
  570. define(`MUL12',
  571. ``;;NUL12'
  572. LCALL __mul12')
  573.  
  574. define(`MUL12u',
  575. ``;;NUL12u'
  576. LCALL __umul12')
  577.  
  578. define(`NE10f',
  579. ``;;NE10f'
  580. MOV A,V1L
  581. ORL A,V1H
  582. JNZ $+5
  583. LJMP $1')
  584.  
  585. define(`NE12',
  586. ``;;NE12'
  587. LCALL __ne12')
  588.  
  589. define(`NEARm',
  590. ` DW $1')
  591.  
  592. define(`OR12',
  593. ``;;OR12'
  594. OPxy(ORL, ORL, V1L, V1H, V2L, V2H)')
  595.  
  596. define(`PLUSn',
  597. `+ $1')
  598.  
  599. define(`POINT1l',
  600. ``;;POINT1l($1)'
  601. MOV DPTR, # $1
  602. MOV V1L,DPL
  603. MOV V1H,DPH')
  604.  
  605. define(`POINT1m',
  606. ``;;POINT1m($1)'
  607. COPYxm(V1L, V1H, $1)')
  608.  
  609. define(`POINT1s',
  610. ``;;POINT1s($1)'
  611. ifdef(1, 1, `MOV DPTR,#' ADJUST($1))
  612. LCALL __point1s')
  613.  
  614. define(`POINT2m',
  615. ``;;POINT2m($1)'
  616. COPYxm(V2L, V2H, $1)')
  617.  
  618. define(`POINT2m_',
  619. `POINT2m_PLUSn($1')
  620.  
  621. define(`POINT2m_PLUSn',
  622. ``;;POINT2m_PLUSn($1)'
  623. MOV DPTR,#$1
  624. MOVX A,@DPTR
  625. MOV V2H,A
  626. INC DPTR
  627. MOVX A,@DPTR
  628. MOV V2L,A')
  629.  
  630. define(`POINT2s',
  631. ``;;POINT2s($1)'
  632. ifdef(1, 1, `MOV DPTR,#' ADJUST($1))
  633. LCALL __point2s')
  634.  
  635. define(`POP2',
  636. ``;;POP2'
  637. LCALL __pop2')
  638.  
  639. define(`PUSH1',
  640. ``;;PUSH1'
  641. LCALL __push1')
  642.  
  643. define(`PUSH2',
  644. ``;;PUSH2'
  645. LCALL __push2')
  646.  
  647. define(`PUSHm',
  648. ``;;PUSHm($1)'
  649. MOV DPTR,# $1
  650. LCALL __pushm')
  651.  
  652. define(`PUSHp',
  653. ``;;PUSHp($1)'
  654. MOV DPTR,# $1
  655. LCALL __pushp')
  656.  
  657. define(`PUSHs',
  658. ``;;PUSHs($1)'
  659. ifdef(1, 1, `MOV DPTR,#' ADJUST($1))
  660. LCALL __pushs')
  661.  
  662. define(`PUT_m_',
  663. `PUT_m_COMMAn($1')dnl
  664.  
  665. define(`PUT_m_COMMAn',
  666. ``;;PUT_m_COMMAn($1, $2)'
  667. MOV DPTR,#$1
  668. MOV A,# HIGH($2)
  669. MOVX @DPTR,A
  670. INC DPTR
  671. MOV A,# LOW($2)
  672. MOVX @DPTR,A')
  673.  
  674. define(`PUTbm1',
  675. ``;;PUTbm1($1)'
  676. MOV DPTR,# $1
  677. MOV A,@DPTR
  678. MOV V1L,A
  679. MOV V1H,#0
  680. JNB ACC.7,$+5
  681. MOV V1H,#-1')
  682.  
  683. define(`PUTbp1',
  684. ``;;PUTbp1'
  685. MOV DPL,V2L
  686. MOV DPH,V2H
  687. MOV A,V1L
  688. MOVX @DPTR,A')
  689.  
  690. define(`PUTwm1',
  691. ``;;PUTwm1'
  692. MOV DPTR,#$1
  693. MOV A,V1H
  694. MOVX @DPTR,A
  695. INC DPTR
  696. MOV A,V1L
  697. MOVX @DPTR,A')
  698.  
  699. define(`PUTwp1',
  700. ``;;PUTwp1'
  701. MOV DPL,V2L
  702. MOV DPH,V2H
  703. MOV A,V1H
  704. MOVX @DPTR,A
  705. INC DPTR
  706. MOV A,V1L
  707. MOVX @DPTR,A')
  708.  
  709. define(`rDEC1',
  710. ``;;rDEC1($1)'
  711. CLR C
  712. OPxn(SUBB, SUBB, V1L, V1H, LOW ($1), HIGH ($1))')
  713.  
  714. define(`rDEC2',
  715. ``;;rDEC2($1)'
  716. CLR C
  717. OPxn(SUBB, SUBB, V2L, V2H, LOW ($1), HIGH ($1))')
  718.  
  719. define(`REFm',
  720. `
  721. $1:')
  722.  
  723. define(`RETURN',
  724. ``;;RETURN($1)' 
  725. ifdef(1, 1, `MOV DPTR,#' eval($1*-1)-4)
  726. LJMP __return
  727. ')
  728.  
  729. define(`rINC1',
  730. ``;;rINC1($1)'
  731. OPxn(ADD, ADDC, V1L, V1H, LOW ($1), HIGH ($1))')
  732.  
  733. define(`rINC2',
  734. ``;;rINC2($1)'
  735. OPxn(ADD, ADDC, V2L, V2H, LOW ($1), HIGH ($1))')
  736.  
  737. define(`SUB_m_',
  738. `SUB_m_COMMAn($1')
  739.  
  740. define(`SUB_m_COMMAn',
  741. ``;;SUB_m_COMMAn($1, $2)'
  742. MOV DPTR,#$1+1
  743. MOVX A,@DPTR
  744. CLR C
  745. SUBB A,# LOW($2)
  746. MOVX @DPTR,A
  747. MOV DPTR,#$1
  748. MOVX A,@DPTR
  749. SUBB A,# HIGH($2)
  750. MOVX @DPTR,A')
  751.  
  752. define(`SUB12',
  753. ``;;SUB12'
  754. CLR C
  755. OPxy(SUBB, SUBB, V1L, V1H, V2L, V2H)')
  756.  
  757. define(`SUB1n',
  758. ``;;SUB1n($1)'
  759. CLR C
  760. OPxn(SUBB, SUBB, V1L, V1H, LOW ($1), HIGH ($1))')
  761.  
  762. define(`SUBbpn',
  763. ``;;SUBbpn'
  764. CLR C
  765. OPpn(SUBB, , LOW ($1), HIGH ($1))')
  766.  
  767. define(`SUBwpn',
  768. ``;;SUBwpn($1)'
  769. CLR C
  770. OPpn(SUBB, SUBB, LOW ($1), HIGH ($1))')
  771.  
  772. define(`SWAP12',
  773. ``;;SWAP12'
  774. MOV A,V1L
  775. XCH A,V2L
  776. MOV V1L,A
  777. MOV A,V1H
  778. XCH A,V2H
  779. MOV V1H,A')
  780.  
  781. define(`SWAP1s',
  782. ``;;SWAP1s'
  783. POP2
  784. SWAP12
  785. PUSH2')
  786.  
  787. define(`SWITCH',
  788. ``;;SWITCH1'
  789. LCALL __switch')
  790.  
  791. define(`XOR12',
  792. ``;;XOR12'
  793. OPxn(XRL, XRL, V2L, V2H, 1, 0)')
  794.  
  795. define(`CSCINIT',
  796. ``;;CSCINIT'
  797. LCALL __cscinit')
  798.  
  799. define(`ENTERM',
  800. ``;;ENTERM'
  801. CLR EA')
  802.  
  803. define(`EXITM',
  804. ``;;EXITM'
  805. SETB EA')
  806.  
  807. divert
  808.  
  809.